package host

import "context"

// Service 接口
type Service interface {
	// CreateHost 创建，返回创建后的主机信息
	CreateHost(context.Context, *Host) (*Host, error) // context是上下文，通知程序能够一致开始，结束；用户无感知。接口给对象，易扩展，后期变字段不影响，直接操作对象
	// QueryHost 查询概览，返回查询的主机列表
	QueryHost(context.Context, *QueryHostRequest) (*HostsSet, error) // 为什么不直接返回host？因为有分页总条数，需要传递，结构传参救就要改变
	// DescribeHost 查询主机详情
	DescribeHost(context.Context, *QueryHostRequest) (*Host, error)
	// UpdateHost 主机更新
	UpdateHost(context.Context, *UpdateHostRequest) (*Host, error)
	// DeleteHost 主机删除
	DeleteHost(context.Context, *DeleteHostRequest) (*Host, error) // 返回给前端删除的内容
}

// HostsSet 查询分页
type HostsSet struct {
	Items []*Host
	Total int
}

// Vendor 给int取个别名，防止混乱
type Vendor int

const (
	// PrivateIDC 枚举默认值
	PrivateIDC Vendor = iota // 0
	// AliYun 枚举默认值
	AliYun
	TencentYun
	HuaweiYun
)

// NewHost 构造host函数
func NewHost() *Host {
	return &Host{
		Resource: &Resource{},
		Describe: &Describe{},
	}
}

// Host 模型 然后定义接口和方法
type Host struct {
	// 公共属性部分
	*Resource
	// 资源独有属性
	*Describe
}

// Resource 类型模型
type Resource struct {
	Id          string            `json:"id"  validate:"required"`     // 全局唯一Id
	Vendor      Vendor            `json:"vendor"`                      // 厂商
	Region      string            `json:"region"  validate:"required"` // 地域
	CreateAt    int64             `json:"create_at"`                   // 创建时间
	ExpireAt    int64             `json:"expire_at"`                   // 过期时间
	Type        string            `json:"type"  validate:"required"`   // 规格
	Name        string            `json:"name"  validate:"required"`   // 名称
	Description string            `json:"description"`                 // 描述
	Status      string            `json:"status"`                      // 服务商中的状态
	Tags        map[string]string `json:"tags"`                        // 标签
	UpdateAt    int64             `json:"update_at"`                   // 更新时间
	SyncAt      int64             `json:"sync_at"`                     // 同步时间
	Account     string            `json:"accout"`                      // 资源的所属账号
	PublicIP    string            `json:"public_ip"`                   // 公网IP
	PrivateIP   string            `json:"private_ip"`                  // 内网IP
}

// Describe 资源独有属性
type Describe struct {
	CPU          int    `json:"cpu" validate:"required"`    // 核数
	Memory       int    `json:"memory" validate:"required"` // 内存
	GPUAmount    int    `json:"gpu_amount"`                 // GPU数量
	GPUSpec      string `json:"gpu_spec"`                   // GPU类型
	OSType       string `json:"os_type"`                    // 操作系统类型，分为Windows和Linux
	OSName       string `json:"os_name"`                    // 操作系统名称
	SerialNumber string `json:"serial_number"`              // 序列号
}

// QueryHostRequest 查询请求，对象
type QueryHostRequest struct {
}

// UpdateHostRequest 查询请求，对象
type UpdateHostRequest struct {
	// 只允许更用该主机的独有信息，就只有独有模型就行了
	*Describe
}

// DeleteHostRequest 查询请求，对象
type DeleteHostRequest struct {
	// 根据id删除
	Id string
}
